package com;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.xml.bind.SchemaOutputResolver;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;

/**
 * 使用DOM4j解析XML文档
 *
 * DOM(Document Object Model)文档对象模型
 * DOM解析模式为先将xml文档按照其标签包含的结构转换为一个树状结构数据
 * 似的我们在获取xml文档内容改为遍历树结构完成
 */
public class ParaseXmlDemo {
    public static void main(String[] args) {
        /*
            解析xml的大致步骤
            1：创建SAXReader
            2：使用SAXReader读取xml文档并产生Document对象
                这一步的作用就是DOM解析模式中先将xml文档读取并构建整颗
                树结构的过程
            3：通过Document对象获取根元素（就是xml中的跟标签内容）
            4：从根元素开始逐级获取子元素，以达到解析xml文档内容的目的
         */
        try {
            //1
            SAXReader reader=new SAXReader();
            //2
            Document doc=reader.read("./emplist.xml");
//            Document doc=reader.read(new File("./emplist.xml"));
//            Document doc=reader.read(new FileInputStream("./emplist.xml"));
            /*3
                Document 对象提供了获取根元素的方法：
                Element getRoot Element（）

                Element的每一个实例用于表示xml文档上的一个元素（一对标签）
                其提供了获取xml元素信息的相关方法，常用的有：
                String getName()
                获取元素名（标签名）

                String getText()
                获取文本（开始与结束标签之间的文本信息）

                Element element(String name)
                获取当前元素中指定名字的字元素中间的文本
                String s=e.element("xxx").getText();
                等同于
                String s=e.elementText("xxx");

                List elements()
                获取当前元素下的所有子元素

                List elements(String name)
                获取当前元素下所有给定的名字的同名子元素
             */
            Element root=doc.getRootElement();//root：<list>

            String name=root.getName();
            System.out.println("根标签"+name);
            //获取跟标签<list>下所有名为<emp>的子标签
            List<Element>list=root.elements("emp");
            System.out.println(list.size());

            //遍历每一个<emp>标签来获取员工信息
            for(Element empEle:list){
                //获取员工姓名
                //通过<emp>获取子标签<name>
                Element nameEle=empEle.element("name");
                //获取<name>标签中间的文本
                String ename=nameEle.getText();

                int age=Integer.parseInt(empEle.element("age").getText());

                String gender=empEle.elementText("gender");

                int salary=Integer.parseInt(empEle.elementText("salary"));


                //获取工号
                //通过<emp>获取属性"id"
//                Attribute attr=empEle.attribute("id");
                //获取id属性的值
//              int id=Integer.parseInt(attr.getValue());
//                int id=Integer.parseInt(empEle.attribute("id").getValue());
                int id=Integer.parseInt(empEle.attributeValue("id"));
                System.out.println(id+","+ename+","+age+","+gender+","+salary);
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }
}
